package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.UsuarioDao;
import edu.upc.clase.demo.entity.Usuario;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author Anyelo
 */
@Repository
public class UsuarioDaoImpl extends SimpleJdbcDaoSupport implements UsuarioDao {

    private static Logger log = LoggerFactory.getLogger(UsuarioDaoImpl.class);

    @Autowired
    public UsuarioDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }

    @Override
    public Integer insertar(Usuario usuario) {

        getJdbcTemplate().update(
                "insert into Usuario(nombres, apellidos, fecNac, email, administrador, usuario, contrasena, borrado) values (?, ?, ?,?,?, ?, ?,?)",
                usuario.getNombres(), usuario.getApellidos(), usuario.getFecNac(), usuario.getEmail(), usuario.getAdministrador(), usuario.getUsuario(), usuario.getContrasena(), usuario.getBorrado());
        return getSimpleJdbcTemplate().queryForInt("select last_insert_id()");
    }

    @Override
    public void actualizar(Usuario usuario) {
        getJdbcTemplate().update("update Usuario\n"
                 + "set\n" 
                 + "nombres = ?,\n"
                 + "apellidos= ?,\n"
                 + "fecNac= ?,\n"
                 + "email= ?,\n"
                 + "administrador= ?,\n"
                 + "usuario= ?,\n" 
                 + "contrasena= ?,\n" 
                 + "borrado= ?\n" 
                 + "where usuarioid = ?",
                 usuario.getNombres(), usuario.getApellidos(), usuario.getFecNac(), usuario.getEmail(), usuario.getAdministrador(), usuario.getUsuario(), usuario.getContrasena(), usuario.getBorrado(), usuario.getUsuarioId());
    }

    @Override
    public void eliminar(Usuario usuario) {
        getJdbcTemplate().update(
                "delete from Usuario where usuarioid = ?", usuario.getUsuarioId());
    }

    @Override
    public Usuario buscar(Integer id) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "SELECT\n"
                    + " usuarioId,\n"
                    + " nombres,\n"
                    + " apellidos,\n"
                    + " fecNac,\n"
                    + " email,\n"
                    + " administrador,\n"
                    + " usuario,\n"
                    + " contrasena,\n"
                    + " borrado\n"
                    + " FROM Usuario where usuarioId =?",
                    new BeanPropertyRowMapper<Usuario>(Usuario.class), id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<Usuario> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                "select usuarioid, nombres, apellidos, fecNac email, administrador, usuario, contrasena from Usuario",
                new BeanPropertyRowMapper<Usuario>(Usuario.class));
    }

    @Override
    public List<Usuario> buscarPorNombre(String nombre) {
        try {
            Map<String, String> parametros = new HashMap<String, String>();
            parametros.put("nombre", "%" + nombre + "%");
            return getSimpleJdbcTemplate().query(
                    "select * from Usuario where nombres like :nombre",
                    new BeanPropertyRowMapper<Usuario>(Usuario.class), parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public Usuario buscar(String email) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}